package com.hzit.order.service.impl;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConfig;
import com.alipay.api.internal.util.AlipaySignature;
import com.hzit.order.entity.Order;
import com.hzit.order.entity.PayLog;
import com.hzit.order.service.IOrderService;
import com.hzit.order.service.IPayLogService;
import com.hzit.order.service.IPayService;
import com.ruoyi.system.api.config.AlipayTemplate;
import com.ruoyi.system.api.domain.PayAsyncVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 类名：
 * 作者：WF
 * 功能：
 */
@Service
public class PayServiceImpl implements IPayService {

	@Autowired
	private AlipayTemplate alipayTemplate;
	@Autowired
	private IPayLogService payLogService;
	@Autowired
	private IOrderService orderService;

	//1. 进行异步验签处理并处理我们自己的业务逻辑
	//1.1 验签成功后，修改支付日志
	//1.2 验签成功后，修改订单状态
	@Override
	public String rsaCheck(Map<String, String[]> parameterMap, PayAsyncVo vo) throws AlipayApiException {
		//1.1 定义map<String,String>用于验签
		Map<String,String> params = new HashMap<>();
		//1.2 将传入的parameterMap转换为Map<String,String>
		for (Iterator<String> iter = parameterMap.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) parameterMap.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i]
						: valueStr + values[i] + ",";
			}
			//乱码解决，这段代码在出现乱码时使用
			params.put(name, valueStr);
		}
		//1.3 开始验签
		boolean signVerified = AlipaySignature.rsaCheckV1(params,
								alipayTemplate.getAlipayPublicKey(),
								alipayTemplate.getCharset(),
								alipayTemplate.getSignType()); //调用SDK验证签名

		//1.4 如果验签成功
		if(signVerified){
			if (vo.getTrade_status().equals("TRADE_SUCCESS") || vo.getTrade_status().equals("TRADE_FINISHED")) {
				//1.4.1 修改支付日志
				//① 得到支付日志中的订单号
				String outTradeNo = vo.getOut_trade_no();
				//② 得到支付日志
				PayLog paylog = payLogService.getById(outTradeNo);
				//③ 更新支付日志
				paylog.setPayTime(LocalDateTime.now());
				paylog.setTradeState("1");      // 修改支付状态
				paylog.setTransactionId(vo.getTrade_no());
				//④ 修改到数据库中
				payLogService.updateById(paylog);

				//1.4.2 得支支付日志中的订单号列表
				String orderList = paylog.getOrderList();
				String[] ids = orderList.split(",");
				for (String id : ids) {
					//① 查询出订单并修改订单状态
					Order order = orderService.getById(id);
					order.setStatus("2");       // 2：代表己支付
					//② 修改回数据库中
					orderService.updateById(order);
				}

				//1.4.3 从redis中删除支付日志
				//todolist...
			}
			return "success";
		}
		return "fail";
	}
}
